package com.octopus.core.parser;

import com.octopus.core.Request;
import com.octopus.core.result.Result;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import lombok.NonNull;

/**
 * 解析结果
 *
 * <p>目标网页一般包含目标数据信息和新的任务连接。解析的数据信息存储在这类对象之中。
 *
 * <p>爬虫引擎会将新的下载任务放进任务队列 ，并将任务数据信息调用采集器进行保存。
 *
 * @author shoulai.yang@gmail.com
 * @date 2019/07/31
 */
public class ParseResult {

  /** 新任务链接列表 */
  private List<Request> requests = new ArrayList<>();

  /** 数据对象 */
  private Result body;

  /**
   * @return 新的解析结果
   */
  public static ParseResult me() {
    return new ParseResult();
  }

  /**
   * 解析结果构造器
   *
   */
  public ParseResult() {
  }

  /**
   * 添加新任务
   *
   * @param requests 新任务列表
   * @return 当前对象
   */
  public ParseResult requests(@NonNull Request... requests) {
    return this.requests(Arrays.asList(requests));
  }

  /**
   * 添加新任务
   *
   * @param requests 新任务列表
   * @return 当前对象
   */
  public ParseResult requests(@NonNull Collection<Request> requests) {
    if (requests != null) {
      this.requests.addAll(requests);
    }
    return this;
  }

  /**
   * 获取所有新的下载任务
   *
   * @return 当前对象
   */
  public List<Request> requests() {
    return this.requests;
  }

  /**
   * 获取解析获得的数据信息
   *
   * @return 数据信息
   */
  public Result body() {
    return this.body;
  }

  /**
   * 设置解析数据信息
   *
   * @param data 数据信息
   * @return 当前对象
   */
  public ParseResult body(Result data) {
    this.body = data;
    return this;
  }
}
